package util

import (
	"encoding/json"
	"fmt"
	"os"
	"path/filepath"
	"zinx-tianjing-study/ziface"
)

/*
 存储关于框架的全局参数，供其他模块使用
*/

// LogConfig 日志配置
type LogConfig struct {
	LogLevel          string `json:"LogLevel"`
	LogPath           string `json:"LogPath"`
	LogFileMaxSize    int    `json:"LogFileMaxSize"`    // MB
	LogFileMaxBackups int    `json:"LogFileMaxBackups"` // 最大备份数
	LogFileMaxAge     int    `json:"LogFileMaxAge"`     // 天
	LogCompress       bool   `json:"LogCompress"`       // 是否压缩
}

// GlobalConfig 全局配置
type GlobalConfig struct {
	Name           string `json:"Name"`
	Host           string `json:"Host"`
	TcpPort        int    `json:"TcpPort"`
	Version        string `json:"Version"`
	MaxConn        uint32 `json:"MaxConn"`        // 最大连接数
	MaxPackageSize uint32 `json:"MaxPackageSize"` // 最大包大小
	WorkerPoolSize uint32 `json:"WorkerPoolSize"` // 工作池大小
	TaskQueueSize  uint32 `json:"TaskQueueSize"`  // 任务队列大小
	MaxMsgSize     uint32 `json:"MaxMsgSize"`     // 最大消息大小

	HeartbeatTimeout int `json:"HeartbeatTimeout"` // 心跳超时时间（秒）
	WriteTimeout     int `json:"WriteTimeout"`     // 写超时时间（秒）
	ReadTimeout      int `json:"ReadTimeout"`      // 读超时时间（秒）

	LogConfig LogConfig `json:"LogConfig"` // 日志配置

	TcpServer ziface.IServer // 当前服务器句柄
}

var GlobalObject *GlobalConfig

// 提供默认配置
func init() {
	// 默认配置
	GlobalObject = &GlobalConfig{
		Name:             "ZinxServer",
		Version:          "v0.1",
		Host:             "0.0.0.0",
		TcpPort:          8999,
		MaxConn:          10,
		MaxPackageSize:   4096,
		WorkerPoolSize:   10,
		TaskQueueSize:    1024,
		MaxMsgSize:       4096,
		HeartbeatTimeout: 60,
		WriteTimeout:     5,
		ReadTimeout:      30,
		LogConfig: LogConfig{
			LogLevel:          "debug",
			LogPath:           "logs",
			LogFileMaxSize:    100,
			LogFileMaxBackups: 10,
			LogFileMaxAge:     30,
			LogCompress:       true,
		},
	}

	// 尝试加载配置文件
	GlobalObject.LoadConfig()
}

// LoadConfig 加载配置文件
func (g *GlobalConfig) LoadConfig() {
	configPath := "../conf/zinx.json"

	if !filepath.IsAbs(configPath) {
		workDir, _ := os.Getwd()
		configPath = filepath.Join(workDir, configPath)
	}

	data, err := os.ReadFile(configPath)
	if err != nil {
		fmt.Printf("Warning: 无法读取配置文件 %s，将使用默认配置: %v\n", configPath, err)
		return
	}

	// 将json文件数据解析到struct中
	err = json.Unmarshal(data, g)
	if err != nil {
		panic(fmt.Sprintf("配置文件解析错误: %v", err))
	}
}
